package com.laoxiang.modules.system.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.laoxiang.execption.LxAdminException;
import com.laoxiang.modules.system.entity.SysConfig;
import com.laoxiang.modules.system.entity.dto.PageDTO;
import com.laoxiang.modules.system.entity.dto.SysConfigDTO;
import com.laoxiang.modules.system.entity.vo.SysConfigVO;
import com.laoxiang.modules.system.mapper.SysConfigMapper;
import com.laoxiang.modules.system.service.SysConfigService;
import com.laoxiang.utils.AppHttpCodeEnum;
import com.laoxiang.utils.BeanCopyUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;

import java.util.List;
import java.util.Objects;

/**
 * 参数配置表(SysConfig)表服务实现类
 *
 * @author db
 * @since 2023-11-17 20:57:28
 */
@Service("sysConfigService")
public class SysConfigServiceImpl extends ServiceImpl<SysConfigMapper, SysConfig> implements SysConfigService {
    @Autowired
    private SysConfigMapper sysConfigMapper;

    @Override
    public SysConfig selectConfigById(Long configId) {
        SysConfig sysConfig = sysConfigMapper.selectById(configId);
        return sysConfig;
    }

    @Override
    public SysConfig selectConfigByKey(String configKey) {
        LambdaQueryWrapper<SysConfig> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(SysConfig::getConfigKey,configKey);
        SysConfig sysConfig = sysConfigMapper.selectOne(queryWrapper);
        return sysConfig;
    }

    @Override
    public PageDTO selectConfigList(Integer pageNum, Integer pageSize, SysConfigVO sysConfigVO) {
        LambdaQueryWrapper<SysConfig> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.like(StringUtils.hasText(sysConfigVO.getConfigName()),SysConfig::getConfigName,sysConfigVO.getConfigName());
        queryWrapper.eq(StringUtils.hasText(sysConfigVO.getConfigKey()),SysConfig::getConfigKey,sysConfigVO.getConfigKey());
        queryWrapper.eq(StringUtils.hasText(sysConfigVO.getConfigType()),SysConfig::getConfigType,sysConfigVO.getConfigType());

        if(Objects.isNull(pageNum)){
            pageNum = 1;
        }
        if(Objects.isNull(pageSize)){
            pageNum = 10;
        }
        Page<SysConfig> sysConfigPage = sysConfigMapper.selectPage(new Page<>(pageNum, pageSize), queryWrapper);
        List<SysConfigDTO> sysConfigDTO = BeanCopyUtils.copyBeanList(sysConfigPage.getRecords(), SysConfigDTO.class);

        // 封装pageDTO
        PageDTO pageDTO = new PageDTO();
        pageDTO.setPageIndex(pageNum);
        pageDTO.setPageSize(pageSize);
        pageDTO.setTotal(sysConfigPage.getTotal());
        pageDTO.setRows(sysConfigDTO);

        return pageDTO;
    }

    @Override
    public int insertConfig(SysConfig config) {
        int num = sysConfigMapper.insert(config);
        return num;
    }

    @Override
    public int updateConfig(SysConfig config) {
        int num = sysConfigMapper.updateById(config);
        return num;
    }

    @Override
    public void deleteConfigById(Long configId) {
        SysConfig sysConfig = sysConfigMapper.selectById(configId);
        if("Y".equals(sysConfig.getConfigType())){
            throw new LxAdminException(AppHttpCodeEnum.CONFIG_SYSTEM_INNER);
        }
        sysConfigMapper.deleteById(configId);
    }

    @Override
    public void deleteConfigByIds(List<Long> configIds) {
        for(Long configId:configIds){
            SysConfig sysConfig = sysConfigMapper.selectById(configId);
            if("Y".equals(sysConfig.getConfigType())){
                throw new LxAdminException(AppHttpCodeEnum.CONFIG_SYSTEM_INNER);
            }
            sysConfigMapper.deleteById(configId);
        }
    }

    @Override
    public Boolean checkConfigKeyUnique(SysConfig sysConfig) {
        Long configId = Objects.isNull(sysConfig.getConfigId()) ? -1L : sysConfig.getConfigId();

        LambdaQueryWrapper<SysConfig> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(StringUtils.hasText(sysConfig.getConfigKey()),SysConfig::getConfigKey,sysConfig.getConfigKey());
        SysConfig info = sysConfigMapper.selectOne(queryWrapper);
        if (Objects.nonNull(info) && info.getConfigId().longValue() != configId.longValue()) {
            return false;
        }

        return true;
    }
}

